home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Tools / Languages / Icon 8.1 / msm-1 / common.sit / long.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-19  |  1.5 KB  |  81 lines  |  [TEXT/MPS ]

  1. /*
  2.  *  long.c -- functions for handling long values on 16-bit computers.
  3.  */
  4.  
  5. #include "::h:gsupport.h"
  6. #include <ctype.h>
  7.  
  8. #if IntBits == 16
  9. /*
  10.  * Long strlen
  11.  */
  12.  
  13. long lstrlen(s)
  14. char *s;
  15. {
  16.     long l = 0;
  17.     while(*s++) l++;
  18.     return l;
  19. }
  20.  
  21. /* Shell sort with some enhancements from Knuth.. */
  22.  
  23. novalue lqsort( base, nel, width, cmp )
  24. char *base; 
  25. int nel;
  26. int width;
  27. int (*cmp)();
  28. {
  29.    register int i, j;
  30.    long int gap;
  31.    int k, tmp ;
  32.    char *p1, *p2;
  33.  
  34.    for( gap=1; gap <= nel; gap = 3*gap + 1 ) ;
  35.  
  36.    for( gap /= 3;  gap > 0  ; gap /= 3 )
  37.        for( i = gap; i < nel; i++ )
  38.            for( j = i-gap; j >= 0 ; j -= gap ) {
  39.                 p1 = base + ( j     * width);
  40.                 p2 = base + ((j+gap) * width);
  41.  
  42.                 if( (*cmp)( p1, p2 ) <= 0 ) break;
  43.  
  44.                 for( k = width; --k >= 0 ;) {
  45.                    tmp   = *p1;
  46.                    *p1++ = *p2;
  47.                    *p2++ = tmp;
  48.                 }
  49.            }
  50. }
  51. #endif                    /* IntBits == 16 */
  52.  
  53. /* 
  54.  * Write a long string in int-sized chunks.
  55.  */
  56.  
  57. long longwrite(s,len,file)
  58. FILE *file;
  59. char *s;
  60. long len;
  61. {
  62.    long tally = 0;
  63.    int n = 0;
  64.    int leftover, loopnum;
  65.    char *p;
  66.  
  67.    leftover = (int)(len % (long)MaxInt);
  68.    for (p = s, loopnum = (int)(len / (long)MaxInt); loopnum; loopnum--) {
  69.        n = fwrite(p,sizeof(char),MaxInt,file);
  70.        tally += (long)n;
  71.        p += MaxInt;
  72.    }
  73.    if (leftover) {
  74.       n = fwrite(p,sizeof(char),leftover,file);
  75.       tally += (long)n;
  76.       }
  77.    if (tally != len)
  78.       return -1;
  79.    else return tally;
  80.    }
  81.